package com.ep.instruktor.komunikat;

import java.util.Date;

import com.ep.general.ActionSupportCustom;
import com.ep.general.RodzajUzytkownika;
import com.ep.general.instruktor.Instruktor;
import com.ep.general.komunikat.KomunikatMdt;
import com.ep.general.komunikat.KomunikatOdbiorcaMdt;
import com.ep.general.komunikat.KomunikatView;
import com.ep.general.komunikat.StatusKomunikatu;
import com.ep.general.komunikat.db.Komunikat;
import com.ep.general.komunikat.db.KomunikatOdbiorca;
import com.ep.instruktor.app.login.LoginRequierd;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class KomunikatAction extends ActionSupportCustom<Instruktor> implements
		LoginRequierd {

	private static final long serialVersionUID = 5412852101231709683L;

	private final String NEW_MESSAGE = "new_message";
	private final String IN_MESSAGE = "in_message";
	private final String OUT_MESSAGE = "out_message";

	private KomunikatView view;
	private com.ep.instruktor.komunikat.KomunikatView viewInstruktor;

	private String messageContent;
	private String messageRecivers;
	private String messageTopic;

	private class OdbiorcyJson {

		private KomunikatOdbiorcaForm[] odbiorcy;

		public KomunikatOdbiorcaForm[] getOdbiorcy() {
			return odbiorcy;
		}

		public void setOdbiorcy(KomunikatOdbiorcaForm[] odbiorcy) {
			this.odbiorcy = odbiorcy;
		}

	}

	public String execute() {
		return SUCCESS;
	}

	public String newMessage() {
		return NEW_MESSAGE;
	}

	public String inMessage() {
		return IN_MESSAGE;
	}

	public String outMessage() {
		return OUT_MESSAGE;
	}

	public String listAdministrator() {
		setDataArray(getViewInstruktor().getOdbiorcyAdministrator());
		return DATA_ARRAY;
	}

	public String listInstruktor() {
		setDataArray(getViewInstruktor().getOdbiorcyInstruktor());
		return DATA_ARRAY;
	}

	public String listKursant() {
		setDataArray(getViewInstruktor().getOdbiorcyKursant());
		return DATA_ARRAY;
	}

	public String listWyslane() {
		setDataArray(getView().getWyslaneInstruktor(getLoggedUser().getId()));
		return DATA_ARRAY;
	}

	public String listOdebrane() {
		setDataArray(getView().getOdebraneInstruktor(getLoggedUser().getId()));
		return DATA_ARRAY;
	}

	public String send() {

		if (messageContent == null) {
			setText("Wpisz treść wiadomości");
			return TEXT_RESULT;
		}
		if (messageContent.equals("")) {
			setText("Wpisz treść wiadomości");
			return TEXT_RESULT;
		}
		if (messageTopic == null) {
			setText("Wpisz temat wiadomości");
			return TEXT_RESULT;
		}
		if (messageTopic.equals("")) {
			setText("Wpisz temat wiadomości");
			return TEXT_RESULT;
		}

		Gson gson = new GsonBuilder().create();
		OdbiorcyJson odbiorcyJson = gson.fromJson(messageRecivers,
				OdbiorcyJson.class);

		if (odbiorcyJson.getOdbiorcy().length == 0) {
			setText("Brak odbiorcow komunikatu");
			return TEXT_RESULT;
		}

		Komunikat komunikat = saveKomunikat();
		saveOdbiorcyKomunikatu(odbiorcyJson, komunikat);

		setText("Wiadomość została wysłana do wybranych odbiorców");
		return TEXT_RESULT;
	}

	private void saveOdbiorcyKomunikatu(OdbiorcyJson odbiorcyJson,
			Komunikat komunikat) {
		KomunikatOdbiorcaMdt komunikatOdbiorcaMdt = new KomunikatOdbiorcaMdt();
		KomunikatOdbiorca entity = null;

		for (int i = 0; i < odbiorcyJson.getOdbiorcy().length - 1; i++) {
			entity = new KomunikatOdbiorca();
			entity.setKomunikat(komunikat);
			entity.setOdbiorcaId(odbiorcyJson.getOdbiorcy()[i].getId());
			entity.setRodzajOdbiorcy(odbiorcyJson.getOdbiorcy()[i].getRodzaj());
			entity.setStatusKomunikatu(StatusKomunikatu.ODEBRANY);
			komunikatOdbiorcaMdt.makePersistent(entity);
		}
	}

	private Komunikat saveKomunikat() {
		Komunikat entity = new Komunikat();
		entity.setTemat(messageTopic);
		entity.setTresc(messageContent);
		entity.setAutorId(getLoggedUser().getId());
		entity.setStatus(StatusKomunikatu.WYSLANY);
		entity.setData(new Date());
		entity.setRodzajAutora(RodzajUzytkownika.INSTRUKTOR);
		return new KomunikatMdt().makePersistent(entity);
	}

	private KomunikatView getView() {
		if (view == null)
			view = new KomunikatView();
		return view;
	}

	private com.ep.instruktor.komunikat.KomunikatView getViewInstruktor() {
		if (viewInstruktor == null)
			viewInstruktor = new com.ep.instruktor.komunikat.KomunikatView();
		return viewInstruktor;
	}

	public String getMessageContent() {
		return messageContent;
	}

	public void setMessageContent(String messageContent) {
		this.messageContent = messageContent;
	}

	public String getMessageRecivers() {
		return messageRecivers;
	}

	public void setMessageRecivers(String messageRecivers) {
		this.messageRecivers = messageRecivers;
	}

	public String getMessageTopic() {
		return messageTopic;
	}

	public void setMessageTopic(String messageTopic) {
		this.messageTopic = messageTopic;
	}

}
